package com.sljr.mvndemo;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

public class DataTypeUtil {
//	private static Map<String, String> dataTypeCache = new HashMap<String, String>();

	private static List<DataTypeModel> dataTypeList = new ArrayList<DataTypeModel>();
	
	static {
//		dataTypeCache.put("java.lang.String", "oracle.sql.CHAR");
//		dataTypeCache.put("java.lang.String", "oracle.sql.CHAR");
//		dataTypeCache.put("java.lang.String", "oracle.sql.CHAR");
//		dataTypeCache.put("java.math.BigDecimal", "oracle.sql.NUMBER");
//		dataTypeCache.put("java.math.BigDecimal", "oracle.sql.NUMBER");
//		dataTypeCache.put("boolean", "oracle.sql.NUMBER");
//		dataTypeCache.put("byte", "oracle.sql.NUMBER");
//		dataTypeCache.put("short", "oracle.sql.NUMBER");
//		dataTypeCache.put("int", "oracle.sql.NUMBER");
//		dataTypeCache.put("long", "oracle.sql.NUMBER");
//		dataTypeCache.put("float", "oracle.sql.NUMBER");
//		dataTypeCache.put("double", "oracle.sql.NUMBER");
//		dataTypeCache.put("double", "oracle.sql.NUMBER");
//		dataTypeCache.put("byte[]", "oracle.sql.RAW");
//		dataTypeCache.put("byte[]", "oracle.sql.RAW");
//		dataTypeCache.put("byte[]", "oracle.sql.RAW");
//		dataTypeCache.put("java.sql.Date", "oracle.sql.DATE");
//		dataTypeCache.put("java.sql.Time", "oracle.sql.DATE");
//		dataTypeCache.put("javal.sql.Timestamp", "oracle.sql.TIMESTAMP");
//		dataTypeCache.put("java.sql.Blob", "oracle.sql.BLOB");
//		dataTypeCache.put("java.sql.Clob", "oracle.sql.CLOB");
		
//		dataTypeCache.put("java.lang.String", "oracle.sql.CHAR");
//		dataTypeCache.put("java.math.BigDecimal", "oracle.sql.NUMBER");
//		dataTypeCache.put("java.lang.Boolean", "oracle.sql.NUMBER");
//		dataTypeCache.put("java.lang.Byte", "oracle.sql.NUMBER");
//		dataTypeCache.put("java.lang.Short", "oracle.sql.NUMBER");
//		dataTypeCache.put("java.lang.Integer", "oracle.sql.NUMBER");
//		dataTypeCache.put("java.lang.Long", "oracle.sql.NUMBER");
//		dataTypeCache.put("java.lang.Float", "oracle.sql.NUMBER");
//		dataTypeCache.put("java.lang.Double", "oracle.sql.NUMBER");
//		dataTypeCache.put("java.lang.Byte[]", "oracle.sql.RAW");
//		dataTypeCache.put("java.sql.Date", "oracle.sql.DATE");
//		dataTypeCache.put("java.sql.Time", "oracle.sql.DATE");
//		dataTypeCache.put("javal.sql.Timestamp", "oracle.sql.TIMESTAMP");
//		dataTypeCache.put("java.sql.Blob", "oracle.sql.BLOB");
//		dataTypeCache.put("java.sql.Clob", "oracle.sql.CLOB");
		
//		dataTypeCache.put("java.lang.String", "VARCHAR2");
//		dataTypeCache.put("java.lang.String", "CHAR");
//		dataTypeCache.put("java.math.BigDecimal", "NUMBER");
//		dataTypeCache.put("java.lang.Boolean", "NUMBER");
//		dataTypeCache.put("java.lang.Byte", "NUMBER");
//		dataTypeCache.put("java.lang.Short", "NUMBER");
//		dataTypeCache.put("java.lang.Integer", "NUMBER");
//		dataTypeCache.put("java.lang.Long", "NUMBER");
//		dataTypeCache.put("java.lang.Float", "NUMBER");
//		dataTypeCache.put("java.lang.Double", "NUMBER");
//		dataTypeCache.put("java.lang.Byte[]", "RAW");
//		dataTypeCache.put("java.util.Date", "DATE");
//		dataTypeCache.put("java.sql.Time", "DATE");
//		dataTypeCache.put("javal.sql.Timestamp", "TIMESTAMP");
//		dataTypeCache.put("java.lang.String", "BLOB");
//		dataTypeCache.put("java.lang.String", "CLOB");
		
		try {
			InputStream in = DataTypeUtil.class.getClassLoader().getResourceAsStream("datatype.csv");
			
			BufferedReader reader = new BufferedReader(new InputStreamReader(in, "UTF-8"));
			String line = null;
			while(null != (line = reader.readLine())) {
				if(line.trim().length() > 0 ) {
					String[] strs = line.split(",");
					if(strs.length != 5) {
						continue;
					}
					dataTypeList.add(new DataTypeModel(strs[0], strs[1], strs[2], strs[3], strs[4]));
				}
			}
			
			in.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private DataTypeUtil() {
		
	}

	public static String findJavaTypeByOracleType(String oracleType) {
//		for(Entry<String, String> entry : dataTypeCache.entrySet()) {
//			String value = entry.getValue();
//			if(value.equals(oracleType)) 
//				return entry.getKey();
//		}
		for(DataTypeModel dtm : dataTypeList) {
			if(dtm.getOracle().equalsIgnoreCase(oracleType)) {
				return dtm.getJava();
			}
		}
		return "java.lang.String";
	}
	
	public static String findJavaTypeBySQLType(String sqlType) {
		for(DataTypeModel dtm : dataTypeList) {
			if(dtm.getSql().equalsIgnoreCase(sqlType)) {
				return dtm.getJava();
			}
		}
		return "java.lang.String";
	}
	
	public static String findJavaTypeByJdbctype(String jdbcType) {
		for(DataTypeModel dtm : dataTypeList) {
			if(dtm.getJdbc().equalsIgnoreCase(jdbcType)) {
				return dtm.getJava();
			}
		}
		return "java.lang.String";
	}
	
	public static String findOracleTypeByJavaType(String javaType) {
//		return dataTypeCache.get(javaType);
		for(DataTypeModel dtm : dataTypeList) {
			if(dtm.getJava().equalsIgnoreCase(javaType)) {
				return dtm.getJava();
			}
		}
		return "VARCHAR2";
	}
	
	public static String findJdbcTypeBySqlType(String sqlType) {
		for(DataTypeModel dtm : dataTypeList) {
			if(dtm.getSql().equalsIgnoreCase(sqlType)) {
				return dtm.getJdbc().substring(dtm.getJdbc().lastIndexOf(".")+1);
			}
		}
		return "VARCHAR";
	}
	
	public static void main(String[] args) {
		String javaType = findJavaTypeBySQLType("VARCHAR2");
		System.out.println(javaType);
	}
}
